搜索 K
Appearance
博客正在加载中...
Appearance
Log4j :log for java (java 的日志) 是 java 主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务
在官网下载 jar 包 Log4j – Download Apache Log4j™ 2
解压,我们只需要里面的这 2 个 jar 包:
api 的 jar 包是接口规范,core 的 jar 包才是具体的实现,如果忘了可以回顾下:常见的日志框架-简单介绍
我们将其放到我们代码所在的路径.
在 jar 包所在目录里,新建测试类
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class HelloLog4j {
private static final Logger logger = LogManager.getLogger(HelloLog4j.class);
public static void main(String[] args) {
logger.error("error");
logger.warn("warn");
logger.info("Info");
logger.debug("debug");
}
} 编译,运行:
> javac -cp "log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j.java
> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
15:33:30.612 [main] ERROR HelloLog4j - error可以看到只输出了 error。
我们新建一个配置文件 Log4j2.xml。Log4j2 会自动加载该文件,该配置文件有点复杂,大家简单看看即可,后面会讲。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<!-- 定义日志格式 -->
<Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
<!-- 定义文件名变量 -->
<Property name="file.err.filename">log/err.log</Property>
<Property name="file.err.pattern">log/err.%i.log.gz</Property>
</Properties>
<!-- 定义Appender,即目的地 -->
<Appenders>
<!-- 定义输出到屏幕 -->
<Console name="console" target="SYSTEM_OUT">
<!-- 日志格式引用上面定义的log.pattern -->
<PatternLayout pattern="${log.pattern}" />
</Console>
<!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
<RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
<PatternLayout pattern="${log.pattern}" />
<Policies>
<!-- 根据文件大小自动切割日志 -->
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<!-- 保留最近10份 -->
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<!-- 对info级别的日志,输出到console -->
<AppenderRef ref="console" level="info" />
<!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
<AppenderRef ref="err" level="error" />
</Root>
</Loggers>
</Configuration>此时我们再次运行:
> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
12-03 15:44:48.556 [main] ERROR HelloLog4j
error
12-03 15:44:48.558 [main] WARN HelloLog4j
warn
12-03 15:44:48.558 [main] INFO HelloLog4j
Info可以看到输出了 error,warn 和 INFO。并且当前目录下生成了 log 文件夹,里面有 err.log 文件。
Log4j2 能够在初始化期间自动寻找配置,它支持 4 种格式的配置文件:
并且按从高到低的加权顺序查找配置文件。例如,如果它找到一个 YAML 配置,它将停止搜索并加载它。注意,只能是这几种配置文件后缀名。
那么,Log4j2 具体是怎么寻找文件的呢?
Log4j2 启动时,首先检查系统属性 log4j.configurationFile,如果设置了该属性,则匹配文件扩展名去加载配置文件,在启动应用时配置该参数。
我们复制一份 Log4j2.xml,重命名为 my.xml 修改第 6 行和第 7 行内容如下:
<Property name="file.err.filename">log/err2.log</Property>
<Property name="file.err.pattern">log/err2.%i.log.gz</Property> 然后运行:
> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" -Dlog4j.configurationFile="my.xml" HelloLog4j
12-03 16:13:07.626 [main] ERROR HelloLog4j
error
12-03 16:13:07.628 [main] WARN HelloLog4j
warn
12-03 16:13:07.628 [main] INFO HelloLog4j
Info可以看到生成了 err2.log 日志文件,也就是采用了我们指定的配置文件
log4j.configurationFile 可以配置如上的绝对路径,也可以配置相对路径,即只配置文件名 myLog4j2.xml,Log4j2 会在 classpath 路径中查找配置文件。
如果没有设置系统属性,则在 classpath 路径中按照顺序查找如下 4 个文件:
log4j2-test.properties
log4j2-test.yaml or log4j2-test.yml
log4j2-test.json or log4j2-test.jsn
log4j2-test.xml 如果还找不到上面的文件,则在 classpath 路径中按照顺序查找如下 4 个文件:
log4j2.properties
log4j2.yaml or log4j2.yml
log4j2.json or log4j2.jsn
log4j2.xml 如果没有任何配置文件,则使用默认配置文件,这将导致日志输出到控制台;默认配置如下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>这也就是为什么我们入门案例里只输出了 error
Log4j2 共有 8 种日志级别,按照优先级从小到大排序:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF当日志级别设置为某一级别时,则会打印大于等于该级别的日志,
比如日志级别设置为 ERROR, 则会打印 ERROR,FATAL 级别的日志。
ALL 会把所有级别的日志打印出来,OFF 不会打印任何级别的日志,所以严格来讲只有中间 6 种日志级别。
Log4j 官方建议实际实用的话,只使用四个级别,** ERROR、WARN、INFO、DEBUG。我们工作中也一般只使用这 4 种。**
有时候 xml 文件写起来比较麻烦,可以考虑使用 properties 文件,我们新建一个 log4j2.properties 文件
name=PropertiesConfig
# 定义变量。指定日志文件的位置和文件名称,以便记录多份日志时,直接引用
property.fileName=peterjxldemo
property.fileDir=./logs
property.filePath=${fileDir}/${fileName}.log
appenders=console, rolling
# rootLogger, 根记录器,所有记录器的父辈
# 指定根日志的级别
rootLogger.level=ALL
# 指定输出的appender引用
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile
# console
# 指定输出源的类型与名称
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
# 输出模板
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
# rootLogger, 根记录器,所有记录器的父辈
# 指定根日志的级别
rootLogger.level=ALL
# 指定输出的appender引用
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile
# console
# 指定输出源的类型与名称
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
# 输出模板
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
# rolling file
appender.rolling.type=RollingFile
appender.rolling.name=InfoRollingFile
appender.rolling.fileName=${filePath}
# 指定当发生Rolling时,文件的转移和重命名规则
appender.rolling.filePattern=${fileDir}/${fileName}_%d{yyyy-MM-dd}_%i.log
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
# 指定记录文件的封存策略,该策略主要是完成周期性的日志文件封存工作
appender.rolling.policies.type=Policies
# 基于时间的触发策略
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
# 当前记录周期为每1h生成一个文件
appender.rolling.policies.time.interval=1
appender.rolling.policies.time.modulate=true
# 基于日志文件体积的触发策略
appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
# 当日志文件体积大于size指定的值时,触发Rolling
appender.rolling.policies.size.size=20M
# 文件封存的覆盖策略
appender.rolling.strategy.type=DefaultRolloverStrategy
# 生成分割(封存)文件的个数
appender.rolling.strategy.max=100然后运行:
>java -cp ".;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
2022-12-03 16:51:35,457 main ERROR Unable to locate appender "InfoRollingFile" for logger config "root"
2022-12-03 16:51:35.491 [ERROR] [main] [HelloLog4j.main(HelloLog4j.java:8)] - error
2022-12-03 16:51:35.494 [ WARN] [main] [HelloLog4j.main(HelloLog4j.java:9)] - warn
2022-12-03 16:51:35.494 [ INFO] [main] [HelloLog4j.main(HelloLog4j.java:10)] - Info
2022-12-03 16:51:35.494 [DEBUG] [main] [HelloLog4j.main(HelloLog4j.java:11)] - debug可以看到有输出,并且有日志文件
输出源,用于定义日志输出的地方。log4j2 支持的输出源有很多,有
ConsoleAppender
控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,以便调试。
name:指定Appender的名字。
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT。
PatternLayout:输出格式,不设置默认为:%m%n。 FileAppender
文件输出源,用于将日志写入到指定的文件,其底层是一个 OutputStreamAppender,需要配置输入到哪个位置(例如:D:/logs/mylog.log)
name:指定Appender的名字。
fileName:指定输出日志的目的文件带全路径的文件名。
PatternLayout:输出格式,不设置默认为:%m%n。 RollingFileAppender
RollingFileAppender 是一个 OutputStreamAppender,它写入 fileName 参数中指定的 File。因为它可以指定当日志文件达到一定大小(如 20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则。避免日志文件过大,工作中常用
为什么叫 rolling 呢?因为日志是滚动的,不断新增的
log4j2 入门教程_timchen525 的博客-CSDN 博客
更多配置相关的说明,可以参考官网的文档: